package br.org.ifrr.repository;

import java.io.Serializable;
import java.util.List;

import javax.inject.Inject;
import javax.persistence.EntityManager;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import br.org.ifrr.model.InventarioSetor;
import br.org.ifrr.repository.filter.InventarioSetorFilter;

public class InventarioSetores implements Serializable {

	private static final long serialVersionUID = 1L;

	@Inject
	private EntityManager manager;

	public InventarioSetor guardar(InventarioSetor inventarioSetor) {
		return manager.merge(inventarioSetor);
	}

	public InventarioSetor porId(Long id) {
		return manager.find(InventarioSetor.class, id);
	}

	@SuppressWarnings("unchecked")
	public List<InventarioSetor> filtrados(InventarioSetorFilter filtro) {
		Session session = manager.unwrap(Session.class);
		Criteria criteria = session.createCriteria(InventarioSetor.class)

				// fazemos uma associação (join) das tabelas que foram criadas os relacionamentos
				.createAlias("gestor", "g")
				.createAlias("material", "m")
				.createAlias("inventario", "i");

		if (StringUtils.isNotBlank(filtro.getTombamentoCefet())) { 
			//  vendedor associado ao pedido pelo alias "v", // criado anteriormente
			  criteria.add(Restrictions.ilike("m.tombCefet", filtro.getTombamentoCefet(),
			  MatchMode.EXACT)); }

		if (StringUtils.isNotBlank(filtro.getTombamentoIfrr())) { 
			 // vendedor associado ao pedido pelo alias "v", // criado anteriormente
			  criteria.add(Restrictions.ilike("m.tombIfrr", filtro.getTombamentoIfrr(),
			  MatchMode.EXACT)); }

		return criteria.addOrder(Order.asc("m.tombIfrr")).list();
		
		
	}
}

/*
 * public InventarioSetor portombCefet(String tombCefet) { try { return
 * manager.createQuery(
 * "from InventarioSetor where upper(tombCefet) = :tombCefet",
 * InventarioSetor.class) .setParameter("tombCefet", tombCefet.toUpperCase())
 * .getSingleResult(); } catch (NoResultException e) { return null; } }
 * 
 * public InventarioSetor portombIfrr(String tombIfrr) {
 * 
 * try { return manager.createQuery(
 * "from InventarioSetor where upper(tombIfrr) = :tombIfrr"
 * ,InventarioSetor.class) .setParameter("tombIfrr", tombIfrr.toUpperCase())
 * .getSingleResult(); } catch (NoResultException e) { return null; } }
 * 
 * 
 * 
 * 
 * /* if (StringUtils.isNotBlank(filtro.getDetombamentoIfrr())) { // id deve ser
 * maior ou igual //(ge = greater or equals) a filtro.getDetombamentoIfrr()
 * criteria.add(Restrictions.ge("tombIfrr", filtro.getDetombamentoIfrr()));
 * 
 * }
 * 
 * if (StringUtils.isNotBlank(filtro.getAtetombamentoIfrr())) { // id deve ser
 * menor ou igual (le = lower or equal) a filtro.numeroDe
 * criteria.add(Restrictions.le("tombIfrr", filtro.getAtetombamentoIfrr())); }
 * 
 * /* if (filtro.getDataCriacaoDe() != null) {
 * criteria.add(Restrictions.ge("dataCriacao", filtro.getDataCriacaoDe())); }
 * 
 * if (filtro.getDataCriacaoAte() != null) {
 * criteria.add(Restrictions.le("dataCriacao", filtro.getDataCriacaoAte())); }
 * 
 * 
 * if (StringUtils.isNotBlank(filtro.getNomeSetor())) { // acessamos o nome do
 * vendedor associado ao pedido pelo alias "v", // criado anteriormente
 * criteria.add(Restrictions.ilike("g.setor", filtro.getNomeSetor(),
 * MatchMode.EXACT)); }
 * 
 * if (StringUtils.isNotBlank(filtro.getNome())) {
 * criteria.add(Restrictions.ilike("especificacao", filtro.getNome(),
 * MatchMode.ANYWHERE)); }
 * 
 * return criteria.addOrder(Order.asc("tombIfrr")).list(); }
 * 
 * public InventarioSetores somaTotal() {
 * 
 * Session session = manager.unwrap(Session.class); Criteria criteria =
 * session.createCriteria(InventarioSetores.class); return (InventarioSetores)
 * criteria.setProjection(Projections.sum("valorBem"));
 * 
 * }
 */
